package main

import "fmt"

// 打印素数

func generate(ch chan int) {
	for i := 2; ; i++ {
		ch <- i
	}
}

func filter(in, out chan int, prime int) {
	for {
		i := <-in
		if i%prime != 0 {
			out <- i
		}
	}
}

func main() {
	ch := make(chan int)
	go generate(ch)
	for {
		prime := <-ch
		fmt.Print(prime, " ")
		// 新增ch接收不能被 prime整除的数, 第一个必为素数
		out := make(chan int)
		// 每一次循环, 都会新增一个针对prime的协程
		go filter(ch, out, prime)
		ch = out
	}
}
